/**
 * @file 砍树.cpp
 * 多组测试用例，
 * 每组测试用例给出不超过1000课树，
 * 并且第二行给出每颗树的高度，初始时，
 * 相邻两个树的距离都相等，需要砍掉最少的树使得这些树高度呈现非递减的序列并且相邻之间距离要相等，
 * 输出最少砍的树的数组。
 */

#include <iostream>
#include <vector>
using namespace std;

//不考虑距离
int func(vector<int>&nums,int n){
    int dp[1005] = {0};//局部最优解
    for(int i=0;i<n;i++)
        dp[i] = 1;
    for(int i=0;i<n;i++){
        for(int j=i-1;j>=0;j--){
            if(nums[j]<=nums[i]){
                dp[i] = dp[i]<dp[j]+1?(dp[j]+1):dp[i];

            }
        }
    }
    int max = 0;
    for(int i=0;i<n;i++)
        max = max<dp[i]?dp[i]:max;
    return n-max;
}
//考虑距离
int dp[1005][1005] = {0};//列表示与上一颗树的距离
int func2(vector<int>&nums,int n){
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            dp[i][j] = 1;
    for(int i=0;i<n;i++){
        for(int j=i-1;j>=0;j--){
            if(nums[j]<=nums[i]){
                int dis = i-j;//距离
                dp[dis][i] = dp[dis][i]<dp[dis][j]+1?(dp[dis][j]+1):dp[dis][i];
            }
        }
    }
    int max = 0;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            max = max<dp[i][j]?dp[i][j]:max;
    return n-max;
}
int main(int argc, char** argv){
    int n = 0;
    while(cin>>n){  //读取到EOF
        vector<int> nums = vector<int>(n);
        for(int i=0;i<n;i++)
            cin>>nums[i];
        cout<<func2(nums,n)<<endl;
    }
    return 0;
}